package com.aaa.sys.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.aaa.sys.entity.Menu;
import com.aaa.sys.dao.MenuDao;
import com.aaa.sys.entity.TreeNode;
import com.aaa.sys.service.MenuService;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.Page;
import org.springframework.util.CollectionUtils;


import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 菜单权限表(Menu)表服务实现类
 *
 * @author makejava
 * @since 2023-06-20 09:08:46
 */
@Service("menuService")
public class MenuServiceImpl implements MenuService {
    @Resource
    private MenuDao menuDao;


    @Override
    public Integer queryChildrenNumById(Integer id) {
        //根据id查询权限
        TreeNode treeNodeById = menuDao.queryMenuById(id);
        System.out.println("treeNodeById-------------"+treeNodeById);
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryAllTree();
        //判断所有数据是否为null
        if (!CollectionUtils.isEmpty(treeNodeList) && ObjectUtil.isNotNull(treeNodeById)){
            bindChildren(treeNodeById,treeNodeList);
            System.out.println("treeNodeById-------------"+treeNodeById);
            if (treeNodeById.getChildren()!=null){
                return treeNodeById.getChildren().size();
            }
        }
        return 0;
    }

    @Override
    public List<TreeNode> queryAllTree() {
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryAllTree();
        //System.out.println("获取menu所有数据："+treeNodeList);
        //定义返回集合
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //判断所有数据是否为null
        //if(treeNodeList!=null&&treeNodeList.size()>0){
        if (!CollectionUtils.isEmpty(treeNodeList)){
            //循环遍历，查找一级节点
            for (TreeNode treeNode : treeNodeList) {
                //父节点为0，都是根节点
                if (treeNode.getParentId()==0){
                    returnTreeNodeList.add(treeNode);
                    //为1级节点找子节点
                    bindChildren(treeNode,treeNodeList);
                }
            }
        }
        return returnTreeNodeList;
    }

    @Override
    public List<TreeNode> queryTreeDataByUserId(Integer userId) {
        //查询所有数据
        List<TreeNode> treeNodeList = menuDao.queryTreeDataByUserId(userId);
        //System.out.println("获取menu所有数据："+treeNodeList);
        //定义返回集合
        List<TreeNode> returnTreeNodeList = new ArrayList<>();
        //判断所有数据是否为null
        //if(treeNodeList!=null&&treeNodeList.size()>0){
        if (!CollectionUtils.isEmpty(treeNodeList)){
            //循环遍历，查找一级节点
            for (TreeNode treeNode : treeNodeList) {
                //父节点为0，都是根节点
                if (treeNode.getParentId()==0){
                    returnTreeNodeList.add(treeNode);
                    //为1级节点找子节点
                    bindChildren(treeNode,treeNodeList);
                }
            }
        }
        return returnTreeNodeList;
    }


    /**
     * 从所有节点中查找当前节点的孩子
     * @param currentTreeNode
     * @param treeNodeList
     */
    private void bindChildren(TreeNode currentTreeNode,List<TreeNode> treeNodeList){
        //循环查找当前节点的孩子
        for (TreeNode treeNode : treeNodeList) {
            //判断循环节点的父节点id是否和当前节点id相等
            if (treeNode.getParentId()==currentTreeNode.getId()){
                //获取当前节点的孩子集合
                List<TreeNode> children = currentTreeNode.getChildren();
                //判断孩子集合是否为null
                if (children==null){
                    //实例化对象，否则会报空指针异常(当前父节点找第一个孩子节点的时候集合为空，所有要实例化一个集合对象)
                    children = new ArrayList<>();
                }
                //添加当前节点到孩子集合
                children.add(treeNode);
                //和当前对象进行绑定(覆盖当前对象children集合属性)
                currentTreeNode.setChildren(children);
                //递归 调用自己为当前节点绑定孩子(传入当前循环节点)
                bindChildren(treeNode,treeNodeList);
            }
        }
    }

    /**
     * 根据用户编号查询该用户拥有的按钮权限
     * @param userId
     * @return
     */
    @Override
    public List<String> queryButtonPermsByUserId(Integer userId) {
        return menuDao.queryButtonPermsByUserId(userId);
    }


    /**
     * 通过ID查询单条数据
     *
     * @param menuId 主键
     * @return 实例对象
     */
    @Override
    public Menu queryById(Integer menuId) {
        return this.menuDao.queryById(menuId);
    }

    /**
     * 分页查询
     *
     * @param page 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo queryByPage(Page<Menu> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMsg());
        }
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        Menu menu = page.getData();
        return new PageInfo(menuDao.queryAllByLimit(menu));
    }

    /**
     * 新增数据
     *
     * @param menu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu insert(Menu menu) {
        this.menuDao.insert(menu);
        return menu;
    }

    /**
     * 修改数据
     *
     * @param menu 实例对象
     * @return 实例对象
     */
    @Override
    public Menu update(Menu menu) {
        this.menuDao.update(menu);
        return this.queryById(menu.getMenuId());
    }

    /**
     * 通过主键删除数据
     *
     * @param menuId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer menuId) {
        return this.menuDao.deleteById(menuId) > 0;
    }
}
